/**
 * 作者：
 * 创建时间：2012-6-26 上午9:54:30
 */
package dragon.model.table;

import dragon.model.base.Model;
import dragon.model.base.ModelDescribe;
import dragon.model.fieldTemplate.FieldTemplate;

/**
 * 数据表字段定义
 */
public class Field extends Model {

	/**
	 * 数据类型
	 */
	@ModelDescribe(annotation = "数据类型")
	private DataType type;

	/**
	 * 字符长度或数值精度(默认为0，不限制；可以用于定义字符串的最大长度以及浮点数的所有数字位的最大个数)
	 */
	@ModelDescribe(annotation = "字符长度或数值精度(默认为0，不限制；可以用于定义字符串的最大长度以及浮点数的所有数字位的最大个数)")
	private int length = 0;

	/**
	 * 标度(用于定义浮点数小数点右边的最大位数，配合length属性定义浮点数)<br>
	 * TODO:暂未启用(预留)
	 */
	@ModelDescribe(annotation = "标度(用于定义浮点数小数点右边的最大位数，配合length属性定义浮点数)<br>暂未启用(预留)")
	private int scale = 0;

	/**
	 * 是否主键(0否，1是)
	 */
	@ModelDescribe(annotation = "是否主键(0否，1是)")
	private int isPrimaryKey = 0;

	/**
	 * 是否必填(0否，1是)
	 */
	@ModelDescribe(annotation = "是否必填(0否，1是)")
	private int isMandatory = 0;

	/**
	 * 初始值，支持表达式expression计算<br>
	 * 目前可用的表达式有：序列：SEQ{name},请求来源的IP：@{IP},当前用户ID：@{USER},当前用户所属组织机构ID：@{ORG}
	 */
	@ModelDescribe(annotation = "初始值，支持表达式expression计算<br>目前可用的表达式有：序列：SEQ{name},请求来源的IP：@{IP},当前用户ID：@{USER},当前用户所属组织机构ID：@{ORG}")
	private String defaultValue;

	/**
	 * 初始值 赋值类型(先赋值:0,后赋值:1)
	 */
	@ModelDescribe(annotation = "初始值 赋值类型(先赋值:0,后赋值:1)")
	private int defaultValueAssignmentType = 0;

	/**
	 * 是否只读(0否，1是)
	 */
	@ModelDescribe(annotation = "是否只读(0否，1是)")
	private int isReadonly = 0;

	/**
	 * 是否可见(0否，1是)
	 */
	@ModelDescribe(annotation = "是否可见(0否，1是)")
	private int isVisible = 1;

	/**
	 * 字段模板
	 */
	@ModelDescribe(annotation = "字段模板")
	private FieldTemplate fieldTemplate;

	/**
	 * 所属数据表
	 */
	@ModelDescribe(annotation = "所属数据表")
	private Table table;

	/**
	 * 校验规则<br>
	 * EasyUI支持的类型有：<br>
	 * email: Match email regex rule.<br>
	 * url: Match URL regex rule.<br>
	 * length[0,100]: Between x and x characters allowed.<br>
	 * remote['http://.../action.do','paramName']: Send ajax request to do validate value, return 'true' when successfully.<br>
	 * [EXT]<br>
	 * 远程调用，可以传递多个表单参数<br>
	 * myremote[param0,param1,param2,param3]<br>
	 * 参数：<br>
	 * param0:url，必填<br>
	 * param1:直接应用此校验规则的dom对象id，必填<br>
	 * param2:需要传递到后台的其它dom对象id，多个以逗号分割，可选<br>
	 * param3:invalidMessage，可选<br>
	 * 后台除了可以获取到指定dom对象的参数值外，还可以获取到默认的参数_CURRENTVALUE(直接应用规则的dom元素的值)。 Return: Plain TEXT [true|false],JSON RESULT[result=true|false,invalidMessage=?]
	 */
	@ModelDescribe(annotation = "校验规则")
	private String validType;

	/*-----------------------------数值类型特有(INT2,INT4,INT8,DECIMAL)-----------------------------------------*/
	/**
	 * 最小值<br>
	 * 数值类型特有(INT2,INT4,INT8,DECIMAL)
	 */
	@ModelDescribe(annotation = "最小值<br>数值类型特有(INT2,INT4,INT8,DECIMAL)")
	private String minValue;

	/**
	 * 最大值<br>
	 * 数值类型特有(INT2,INT4,INT8,DECIMAL)
	 */
	@ModelDescribe(annotation = "最大值<br>数值类型特有(INT2,INT4,INT8,DECIMAL)")
	private String maxValue;

	@Override
	public String toString() {
		StringBuilder str = new StringBuilder();
		str.append(super.toString());
		str.append("dragon.model.table.Field:").append("\n");
		str.append("type=").append(type).append("\t");
		str.append("length=").append(length).append("\t");
		str.append("scale=").append(scale).append("\t");
		str.append("isPrimaryKey=").append(isPrimaryKey).append("\t");
		str.append("isMandatory=").append(isMandatory).append("\t");
		str.append("defaultValue=").append(defaultValue).append("\t");
		str.append("defaultValueAssignmentType=").append(defaultValueAssignmentType).append("\t");
		str.append("isReadonly=").append(isReadonly).append("\t");
		str.append("isVisible=").append(isVisible).append("\t");
		str.append("fieldTemplate=").append(fieldTemplate != null ? fieldTemplate.toString() : null).append("\t");
		str.append("table=").append(table != null ? table.getName() + "[" + table.getCode() + "]" : null).append("\t");
		str.append("validType=").append(validType).append("\t");
		str.append("minValue=").append(minValue).append("\t");
		str.append("maxValue=").append(maxValue).append("\t");
		str.append("\n");
		return str.toString();
	}

	@Override
	public String toHtmlString() {
		StringBuilder str = new StringBuilder();
		str.append(super.toHtmlString());
		str.append("dragon.model.table.Field:").append("<br/>");
		str.append("type=").append(type).append("&nbsp;&nbsp;");
		str.append("length=").append(length).append("&nbsp;&nbsp;");
		str.append("scale=").append(scale).append("&nbsp;&nbsp;");
		str.append("isPrimaryKey=").append(isPrimaryKey).append("&nbsp;&nbsp;");
		str.append("isMandatory=").append(isMandatory).append("&nbsp;&nbsp;");
		str.append("defaultValue=").append(defaultValue).append("&nbsp;&nbsp;");
		str.append("defaultValueAssignmentType=").append(defaultValueAssignmentType).append("&nbsp;&nbsp;");
		str.append("isReadonly=").append(isReadonly).append("&nbsp;&nbsp;");
		str.append("isVisible=").append(isVisible).append("&nbsp;&nbsp;");
		str.append("fieldTemplate=").append(fieldTemplate != null ? fieldTemplate.toHtmlString() : null).append("&nbsp;&nbsp;");
		str.append("table=").append(table != null ? table.toHtmlString() : null).append("&nbsp;&nbsp;");
		str.append("validType=").append(validType).append("&nbsp;&nbsp;");
		str.append("minValue=").append(minValue).append("&nbsp;&nbsp;");
		str.append("maxValue=").append(maxValue).append("&nbsp;&nbsp;");
		str.append("<br/>");
		return str.toString();
	}

	/**
	 * @return the type
	 */
	public DataType getType() {
		return type;
	}

	/**
	 * @param type
	 *            the type to set
	 */
	public void setType(DataType type) {
		this.type = type;
	}

	/**
	 * @return the length
	 */
	public int getLength() {
		return length;
	}

	/**
	 * @param length
	 *            the length to set
	 */
	public void setLength(int length) {
		this.length = length;
	}

	/**
	 * @return the scale
	 */
	public int getScale() {
		return scale;
	}

	/**
	 * @param scale
	 *            the scale to set
	 */
	public void setScale(int scale) {
		this.scale = scale;
	}

	/**
	 * @return the isPrimaryKey
	 */
	public int getIsPrimaryKey() {
		return isPrimaryKey;
	}

	/**
	 * @param isPrimaryKey
	 *            the isPrimaryKey to set
	 */
	public void setIsPrimaryKey(int isPrimaryKey) {
		this.isPrimaryKey = isPrimaryKey;
	}

	/**
	 * @return the isMandatory
	 */
	public int getIsMandatory() {
		return isMandatory;
	}

	/**
	 * @param isMandatory
	 *            the isMandatory to set
	 */
	public void setIsMandatory(int isMandatory) {
		this.isMandatory = isMandatory;
	}

	/**
	 * @return the defaultValue
	 */
	public String getDefaultValue() {
		return defaultValue;
	}

	/**
	 * @param defaultValue
	 *            the defaultValue to set
	 */
	public void setDefaultValue(String defaultValue) {
		this.defaultValue = defaultValue;
	}

	/**
	 * @return the isReadonly
	 */
	public int getIsReadonly() {
		return isReadonly;
	}

	/**
	 * @param isReadonly
	 *            the isReadonly to set
	 */
	public void setIsReadonly(int isReadonly) {
		this.isReadonly = isReadonly;
	}

	/**
	 * @return the isVisible
	 */
	public int getIsVisible() {
		return isVisible;
	}

	/**
	 * @param isVisible
	 *            the isVisible to set
	 */
	public void setIsVisible(int isVisible) {
		this.isVisible = isVisible;
	}

	/**
	 * @return the table
	 */
	public Table getTable() {
		return table;
	}

	/**
	 * @param table
	 *            the table to set
	 */
	public void setTable(Table table) {
		this.table = table;
	}

	/**
	 * @return the fieldTemplate
	 */
	public FieldTemplate getFieldTemplate() {
		return fieldTemplate;
	}

	/**
	 * @param fieldTemplate
	 *            the fieldTemplate to set
	 */
	public void setFieldTemplate(FieldTemplate fieldTemplate) {
		this.fieldTemplate = fieldTemplate;
	}

	/**
	 * @return the minValue
	 */
	public String getMinValue() {
		return minValue;
	}

	/**
	 * @param minValue
	 *            the minValue to set
	 */
	public void setMinValue(String minValue) {
		this.minValue = minValue;
	}

	/**
	 * @return the maxValue
	 */
	public String getMaxValue() {
		return maxValue;
	}

	/**
	 * @param maxValue
	 *            the maxValue to set
	 */
	public void setMaxValue(String maxValue) {
		this.maxValue = maxValue;
	}

	/**
	 * @return the defaultValueAssignmentType
	 */
	public int getDefaultValueAssignmentType() {
		return defaultValueAssignmentType;
	}

	/**
	 * @param defaultValueAssignmentType
	 *            the defaultValueAssignmentType to set
	 */
	public void setDefaultValueAssignmentType(int defaultValueAssignmentType) {
		this.defaultValueAssignmentType = defaultValueAssignmentType;
	}

	/**
	 * @return the validType
	 */
	public String getValidType() {
		return validType;
	}

	/**
	 * @param validType
	 *            the validType to set
	 */
	public void setValidType(String validType) {
		this.validType = validType;
	}

}
